package com.example.config;

import com.example.bean.Bus;
import com.example.bean.Car;
import com.example.bean.Cat;
import com.example.bean.Cherry;
import com.example.bean.Dog;
import com.example.bean.DogFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;

/**
 * import导入组件，会被容器注册，id默认是全类名
 */

@Import({Cat.class, Dog.class, MyImportSelector.class, MyImportRegister.class, MyBeanPostProcessor.class})
public class SpringConfig3 {

    /**
     * 根据id获取到的对象仍然是Dog类型而不是DogFactoryBean类型！
     * 如果想要获取DogFactoryBean的实例。需要在id前面加上& -> getBean("&dogFactoryBean")
     */
    @Bean
    public DogFactoryBean dogFactoryBean() {
        return new DogFactoryBean();
    }

    /**
     * Bean的生命周期 创建 初始化 销毁的过程，由容器管理
     * 自定义指定初始化与销毁方法，当前容器进行到某个生命周期时，执行自定义的方法
     * 生命周期方法必须没有参数但是可以抛出异常
     * 单实例对象容器启动执行构造器和初始化，容器关闭执行销毁
     * 多实例对象即使容器关闭也不执行销毁方法
     */
    @Bean(initMethod = "init", destroyMethod = "destory")
    public Car car() {
        return new Car();
    }

    /**
     * 使用实现接口的办法实现生命周期管理
     */
    @Bean
    public Cherry cherry() {
        return new Cherry();
    }

    /**
     * JSR250 注解的方式实现生命周期管理
     */
    @Bean
    public Bus bus() {
        return new Bus();
    }
}









